import configparser
import os

import psutil
from PyQt5.QtCore import QObject, pyqtSignal, QThreadPool
from PyQt5.uic import loadUi


# 自定义信号源对象类型，一定要继承自 QObject  用于从工作线程发送结果到主线程
class ResultSignal(QObject):
    # 传输 购买流程中 数据展示
    index_signal = pyqtSignal(str)


class BaseGui(object):
    def __init__(self):
        # 加载 ui
        self.ui = loadUi('main.ui', baseinstance=None)
        # 加载配置
        config = configparser.ConfigParser()
        config.read('config.ini')
        self.ui.login_url = config.get('STARTUP', 'login_url')  # rapid 登录路径
        self.ui.login_token = config.get('TOKEN', 'token')  # rapid token
        self.ui.phones = config.get('STARTUP', 'phones').split(',')  # 发送短信手机号
        # 实例化 信号类
        self.ms = ResultSignal()
        # 多线程 线程池
        self.threadpool = QThreadPool()
        # 设置线程池的最大线程数
        self.threadpool.setMaxThreadCount(calculateCpuThreadNum())


def calculateCpuThreadNum():
    # 获取CPU核心数
    cpu_count = os.cpu_count()
    print(f"CPU Cores: {cpu_count}")

    # 获取系统总内存和可用内存
    virtual_mem = psutil.virtual_memory()
    total_mem = virtual_mem.total / (1024.0 ** 3)  # 转换为GB
    avail_mem = virtual_mem.available / (1024.0 ** 3)  # 转换为GB
    print(f"Total Memory: {total_mem:.2f} GB")
    print(f"Available Memory: {avail_mem:.2f} GB")

    # 基于CPU核心数和可用内存估算最大线程数
    # 这里是一个简单的估算方法，具体值可以根据应用的需求调整
    # 例如，假设每个线程需要至少0.4GB的可用内存，并且我们不想使用超过CPU核心数两倍的线程数
    max_mem_per_thread = 0.08  # 每个线程所需的最大内存（GB）
    max_threads_cpu = cpu_count * 6 + 6  # 基于CPU核心数的最大线程数
    max_threads_mem = int(avail_mem / max_mem_per_thread)  # 基于可用内存的最大线程数
    # 选择两个值中较小的那个作为线程池的最大线程数
    print(max_threads_cpu, max_threads_mem)
    return min(max_threads_cpu, max_threads_mem)
